home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Best of Select: Games Special 4
/
THE BEST OF SELECT Games Special 4 (Select CD-ROM)(1996).iso
/
dosgames
/
abuse
/
lisp
/
doors.lsp
< prev
next >
Wrap
Lisp/Scheme
|
1995-09-13
|
6KB
|
204 lines
;; Copyright 1995 Crack dot Com, All Rights reserved
;; See licensing information for more details on usage rights
(defun general_door_ai (push?)
(select (aistate)
(0 (if (> (total_objects) 0) ; are we linked to a key?
(progn
(set_state blocking) ; don't let play pass
(if push?
(push_char (+ (picture_width) 8) (picture_height)))
)
(if (touching_bg) ; found key, wait till touching to open
(progn (set_state running) ; start opening animation
(play_sound SWISH 70 (x) (y))
(go_state 1))
nil)))
(1 (if (not (next_picture)) ; wait till open animation finishes
(progn
(set_state stopped) ; set opened animation
(go_state 2))))
(2 (if (> (total_objects) 0) ; wait till level editor links us to a key
(progn
(set_state blocking)
(go_state 0))
(next_picture))))
T)
(defun sdoor_ai ()
(general_sdoor_ai T))
(defun general_sdoor_ai (push?)
(select (aistate)
(0 ; closed, wait for signal
(if (> (total_objects) 0)
(if (not (eq (with_object (get_object 0) (aistate)) 0))
(progn (set_state running)
(play_sound SWISH 70 (x) (y))
(go_state 1))
(progn
(set_state stopped)
(if push?
(push_char (+ (picture_width) 8) (picture_height)))))))
(1 ; opening
(if (next_picture) nil
(progn
(set_state blocking)
(set_aistate 2))))
(2 (if (> (total_objects) 0)
(if (eq (with_object (get_object 0) (aistate)) 0)
(progn (set_state walking)
(play_sound SWISH 70 (x) (y))
(go_state 3)))))
(3 ; closing
(if (next_picture) nil
(progn
(set_state stopped)
(set_aistate 0))))
)
T)
(def_char SWITCH_DOOR
(funs (ai_fun sdoor_ai)
(reload_fun lower_reload))
(flags (can_block T))
(range 250 60)
(draw_range 30 50)
(abilities (push_xrange 1))
(states "art/chars/door.spe"
(stopped "door0006.pcx")
(running (seq "door" 6 1))
(walking (seq "door" 1 6))
(blocking "door0001.pcx")))
(defun ff_push (who xamount)
(if who
(progn
(let ((bgx (with_object who (x)) (x))
(bgy (with_object who (y)) (y)))
(if (and (>= bgy (y)) (<= bgy (+ end_y 20))
(< (abs (- bgx (x))) xamount))
(let ((amount (if (> bgx (x))
(- xamount (- bgx (x)))
(- (- (x) bgx) xamount))))
(with_object who (try_move amount 0)))))
(ff_push (next_focus who) xamount))))
(defun ff_ai ()
(shift_rand_table (random 80))
(if (activated)
(let ((nowx (x))
(nowy (y)))
(if (eq (mod (game_tick) 4) 0)
(play_sound FF_SND 127 (x) (y)))
(try_move 0 (+ (y) 200)) ;; find the floor
(setq end_y (y)) ;; save the position
(set_x nowx)
(set_y nowy)
(ff_push (first_focus) 35)))
T)
(defun ff_draw ()
(if (edit_mode) (draw))
(if (activated)
(progn
(ascatter_line (x) (y) (x) end_y (find_rgb 151 139 151) (find_rgb 75 69 75) 3)
(ascatter_line (x) (y) (x) end_y (find_rgb 139 147 191) (find_rgb 69 73 95) 2)
(ascatter_line (x) (y) (x) end_y (find_rgb 39 55 71) (find_rgb 19 27 35) 2)
(ascatter_line (x) (y) (x) end_y (find_rgb 39 55 71) (find_rgb 20 26 35) 2))))
(def_char FORCE_FIELD
(funs (ai_fun ff_ai)
(draw_fun ff_draw))
(range 10 500)
(vars end_y)
(states "art/misc.spe"
(stopped "force_field")))
(defun hwall_ai ()
(if (or (eq (hp) 0)
(and (eq (total_objects) 1)
(with_object (get_object 0) (not (eq (aistate) 0)))))
(progn
(add_object EXPLODE1 (+ (x) 15) (- (y) 7) 0)
(play_sound HWALL_SND 127 (x) (y))
(hurt_radius (+ (x) (* 15 (direction))) (- (y) 7) 50 60 (bg) 20)
nil)
T))
(defun big_wall_ai ()
(if (or (eq (hp) 0)
(and (eq (total_objects) 1)
(with_object (get_object 0) (not (eq (aistate) 0)))))
(progn
(add_object EXPLODE1 (- (x) 15) (- (y) 7) 0)
(add_object EXPLODE1 (+ (x) 15) (- (y) 22) 0)
(add_object EXPLODE1 (+ (x) (random 5)) (+ (+ (random 5) (y)) -20) 0)
(play_sound HWALL_SND 127 (x) (y))
(hurt_radius (x) (- (y) 15) 110 120 (bg) 20)
nil)
T))
(defun hwall_damage (amount from hitx hity push_xvel push_yvel)
(if (activated)
(progn
(damage_fun amount from hitx hity push_xvel push_yvel)
(let ((max_hp (get_ability start_hp)))
(if (and (not (eq (hp) 0)) (not (> (hp) max_hp)))
(set_current_frame (/ (* (total_frames) (- max_hp (hp))) max_hp)))))))
(defun hwall_reload () ;; we changed this , make sure this is reflected in all of the levels
(if (eq (hp) 60)
(set_hp 25)))
(defun make_hidden_wall_char (name start end ai)
(eval `(def_char ,name
(funs (ai_fun ,ai)
(reload_fun hwall_reload)
(damage_fun hwall_damage))
(abilities (start_hp 25))
(draw_range 80 80)
(flags (can_block T)
(unactive_shield T)
(hurtable T))
(states "art/chars/sect.spe"
(stopped (seq "sect" ,start ,end)))))) ; damn lisp is cool
(make_hidden_wall_char 'HIDDEN_WALL1 1 3 'hwall_ai)
(make_hidden_wall_char 'HIDDEN_WALL2 4 6 'hwall_ai)
(make_hidden_wall_char 'HIDDEN_WALL3 7 9 'hwall_ai)
(make_hidden_wall_char 'HIDDEN_WALL4 10 12 'hwall_ai)
(make_hidden_wall_char 'HIDDEN_WALL5 13 15 'hwall_ai)
(make_hidden_wall_char 'HIDDEN_WALL_2x2 16 18 'big_wall_ai)
(make_hidden_wall_char 'HIDDEN_WALL_3WAL 19 21 'big_wall_ai)
(make_hidden_wall_char 'HIDDEN_WALL_3FLR 22 24 'big_wall_ai)
(make_hidden_wall_char 'HIDDEN_WALL_3TOP 25 27 'big_wall_ai)
(make_hidden_wall_char 'HIDDEN_WALL_AFLR 28 30 'big_wall_ai)
(make_hidden_wall_char 'HIDDEN_RAMP1 31 33 'hwall_ai)
(make_hidden_wall_char 'HIDDEN_RAMP2 34 36 'hwall_ai)